/* 
    async + await 是异步的终极解决方案 在es6里面只是一草案，是属于 ES2017（es8）里面才正式的发布。

    但是在目前已经完全实现了。可以放心的时候，即使担心在低版本浏览器不能使用，可以使用 babel 进行转换

    https://es6.ruanyifeng.com/#docs/async

 */
const fs = require('fs');


function sum(a, b) {
    return a + b;
}

let c = sum(1, 2);

/* 现在我们希望 异步的api也可以类似传统函数通过变量接受其返回值 */

function readFile(filePath) {
    return new Promise((resolve, reject) => {
        fs.readFile(filePath, 'utf8', (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve(data);
            }
        });
    });
}

/* 希望 可以直接通过变量接受异步返回的值 es6
await 可以等待后面的 Promise对象 resolve时候的数据（文件的内容），然后将其赋值给变量。
特点：目前 await函数不能裸奔，必须要在一个异步函数里面才可以使用
await is only valid in async functions and the top level bodies of modules
async 标识这个函数是一个异步函数，里面存在异步的逻辑

同步的方式去写异步的代码，可以使用 async await 来解决

async + await 只是 generator + yield +  Promise + co 的语法糖。
async + await 底层还是使用的 【generator + yield +  Promise + co 的语法糖】技术栈
*/

async function go() {
    let dataA = await readFile('./data/1.txt');
    let dataB = await readFile('./data/2.txt');
    let dataC = await readFile('./data/3.txt');
    console.log(dataA, dataB, dataC);
}

// go();

/* 也可以使用匿名自执行 */

;
(async () => {
    let dataA = await readFile('./data/1.txt');
    let dataB = await readFile('./data/2.txt');
    let dataC = await readFile('./data/3.txt');
    console.log(dataA, dataB, dataC);
})();